#ifndef UNIFIEDFILEINFO_H
#define UNIFIEDFILEINFO_H

#include <QString>
#include <QDateTime>
#include <QPixmap>
#include <QList>
#include <QHash>
#include <QVariant>
#include "filestatusiconmanager.h"
#include "cachepathinfo.h"

/**
 * UnifiedFileInfo - 统一的文件信息类
 * 
 * 完全重构版本，整合项目中所有文件信息相关的结构体。
 * 作为唯一的文件信息数据模型，提供完整的文件管理功能。
 */

// 文件类型枚举
enum class FileType {
    Image,
    PDF,
    Unknown
};

// 布局模式枚举
enum class LayoutMode {
    SingleColumn = 1,
    TwoColumns = 2,
    ThreeColumns = 3
};

// 为 LayoutMode 添加 QDebug 支持
inline QDebug operator<<(QDebug debug, LayoutMode mode) {
    switch (mode) {
        case LayoutMode::SingleColumn:
            debug << "SingleColumn";
            break;
        case LayoutMode::TwoColumns:
            debug << "TwoColumns";
            break;
        case LayoutMode::ThreeColumns:
            debug << "ThreeColumns";
            break;
        default:
            debug << "Unknown(" << static_cast<int>(mode) << ")";
            break;
    }
    return debug;
}

// 页码位置枚举
enum class PageNumberPosition {
    FooterCenter = 1,
    FooterRight = 2,
    HeaderRight = 3
};

// 页码格式枚举
enum class PageNumberFormat {
    SimpleNumber = 0,
    WithTotalPages = 1
};

// 分割策略枚举
enum class SplitStrategy {
    MergeThenSplit = 0,
    SplitThenMerge = 1
};

// 文件处理状态枚举
enum class FileProcessStatus {
    Waiting,
    Processing,
    Completed,
    Error,
    Cancelled  // === 关键补充：任务取消状态 ===
};

class UnifiedFileInfo
{
public:
    // === 构造函数 ===
    UnifiedFileInfo() = default;
    explicit UnifiedFileInfo(const QString& filePath);
    UnifiedFileInfo(const QString& filePath, const QString& fileName, FileType fileType);
    
    // === 基本文件信息 ===
    QString filePath;
    QString fileName;
    FileType fileType = FileType::Unknown;
    qint64 fileSize = 0;
    QDateTime lastModified;
    QDateTime addedTime;
    
    // === Martin Fowler重构：位置信息 ===
    int displayOrder = 0;  // 显示顺序，用于排序
    
    // === 页面信息 ===
    int pageCount = 1;
    bool hasLongPages = false;
    bool isLongPage = false;
    
    // === 处理设置 ===
    LayoutMode layoutMode = LayoutMode::SingleColumn;
    bool enableEnhancement = false;
    int brightnessAdjustment = 0;
    int contrastAdjustment = 0;
    SplitStrategy splitStrategy = SplitStrategy::MergeThenSplit;
    
    // === 页码设置 ===
    PageNumberPosition pageNumberPosition = PageNumberPosition::FooterCenter;
    PageNumberFormat pageNumberFormat = PageNumberFormat::SimpleNumber;
    int startingPageNumber = 1;
    
    // === 文档信息 ===
    bool generateCoverPage = false;
    QString documentTitle;
    
    // === 处理状态 ===
    bool isProcessed = false;
    FileProcessStatus processStatus = FileProcessStatus::Waiting;
    int progress = 0;  // 0-100
    QString statusText = "等待处理";
    QString errorMessage;
    
    // === 文件状态和进度 ===
    FileStatusIconManager::FileStatus status = FileStatusIconManager::FileStatus::Queued;
    
    // === 文件标识和缓存元数据 ===
    QString fileIdentity;
    QDateTime identityTime;
    int cachedPageCount = 0;
    QDateTime cachedLatestTime;

    // === Martin Fowler重构：文件级缓存路径信息 ===
    CachePathInfo cachePathInfo;  // 封装文件的实际缓存路径信息
    
    // === 处理结果 ===
    QList<QPixmap> processedPages;
    QPixmap thumbnail;  // 按需加载
    
    // === 导出相关 ===
    int exportStartPageNumber = 1;  // 导出起始页码
    QString tempPdfPath;            // 临时PDF路径
    
    // === 静态工具方法 ===
    
    // 文件类型检测
    static FileType detectFileType(const QString& filePath);
    static QString fileTypeToString(FileType type);
    static FileType stringToFileType(const QString& typeString);
    
    // 布局模式转换
    static int layoutModeToInt(LayoutMode mode);
    static LayoutMode intToLayoutMode(int mode);
    static QString layoutModeToString(LayoutMode mode);
    
    // 页码位置转换
    static int pageNumberPositionToInt(PageNumberPosition position);
    static PageNumberPosition intToPageNumberPosition(int position);
    static QString pageNumberPositionToString(PageNumberPosition position);
    
    // 页码格式转换
    static int pageNumberFormatToInt(PageNumberFormat format);
    static PageNumberFormat intToPageNumberFormat(int format);
    static QString pageNumberFormatToString(PageNumberFormat format);
    
    // 分割策略转换
    static int splitStrategyToInt(SplitStrategy strategy);
    static SplitStrategy intToSplitStrategy(int strategy);
    static QString splitStrategyToString(SplitStrategy strategy);
    
    // 处理状态转换
    static QString processStatusToString(FileProcessStatus status);
    static FileProcessStatus stringToProcessStatus(const QString& status);
    
    // === 实例方法 ===
    
    // 计算总页数（考虑布局模式）
    int calculateTotalPages() const;
    
    // 生成文件标识
    QString generateFileIdentity() const;
    
    // 格式化文件大小
    QString formatFileSize() const;
    
    // 检查文件是否有效
    bool isValid() const;
    
    // 检查是否需要处理
    bool needsProcessing() const;
    
    // 检查是否处理完成
    bool isProcessingComplete() const;
    
    // 检查是否有错误
    bool hasError() const;
    
    // 重置处理状态
    void resetProcessingState();
    
    // 更新处理进度
    void updateProgress(int progress, const QString& statusText);
    
    // 设置错误状态
    void setError(const QString& errorMessage);
    
    // 设置完成状态
    void setCompleted();
    
    // 设置处理中状态
    void setProcessing();
    
    // 获取显示名称
    QString getDisplayName() const;
    
    // 获取文件扩展名
    QString getFileExtension() const;
    
    // 检查是否为图片文件
    bool isImageFile() const;
    
    // 检查是否为PDF文件
    bool isPdfFile() const;
    
    // 更新文件信息（从磁盘读取）
    bool refreshFromDisk();
    
    // 生成缩略图
    bool generateThumbnail(const QSize& size = QSize(100, 100));
    
    // 清理处理结果
    void clearProcessedData();

    // === Martin Fowler重构：缓存路径管理方法 ===

    /**
     * 获取文件的实际缓存目录
     * @return 实际缓存目录路径
     */
    QString getActualCacheDirectory() const;

    /**
     * 获取文件的完整缓存目录路径（包含文件标识）
     * @return 完整缓存目录路径
     */
    QString getFullCacheDirectory() const;

    /**
     * 获取指定页面的缓存文件路径
     * @param pageIndex 页面索引
     * @return 页面缓存文件路径
     */
    QString getPageCacheFilePath(int pageIndex) const;

    /**
     * 获取缩略图缓存目录路径
     * @return 缩略图缓存目录路径
     */
    QString getThumbnailCacheDirectory() const;

    /**
     * 获取指定缩略图的缓存文件路径
     * @param thumbnailIndex 缩略图索引
     * @return 缩略图缓存文件路径
     */
    QString getThumbnailCacheFilePath(int thumbnailIndex) const;

    /**
     * 设置文件的实际缓存目录（在缓存创建时调用）
     * @param cacheDirectory 实际使用的缓存目录
     */
    void setActualCacheDirectory(const QString& cacheDirectory);

    /**
     * 检查文件的缓存目录是否存在
     * @return 如果缓存目录存在返回true
     */
    bool cacheDirectoryExists() const;

    /**
     * 确保文件的缓存目录存在
     * @return 如果创建成功或已存在返回true
     */
    bool ensureCacheDirectoryExists() const;

    /**
     * 删除文件的整个缓存目录
     * @return 如果删除成功返回true
     */
    bool removeCacheDirectory() const;

    /**
     * 检查是否使用全局缓存配置
     * @return 如果使用全局配置返回true
     */
    bool isUsingGlobalCacheConfig() const;

    /**
     * 更新缓存路径为当前全局配置（用于配置迁移）
     * @param newGlobalCacheDirectory 新的全局缓存目录
     */
    void updateCachePathToGlobalConfig(const QString& newGlobalCacheDirectory);

    /**
     * 获取缓存路径状态信息（用于调试）
     * @return 格式化的状态信息
     */
    QString getCachePathStatusInfo() const;

    // === 比较操作符 ===
    bool operator==(const UnifiedFileInfo& other) const;
    bool operator!=(const UnifiedFileInfo& other) const;
    bool operator<(const UnifiedFileInfo& other) const;  // 用于排序
    
    // === 序列化支持 ===
    QString toString() const;
    QHash<QString, QVariant> toVariantMap() const;
    static UnifiedFileInfo fromVariantMap(const QHash<QString, QVariant>& map);
    
    // === 调试支持 ===
    QString debugString() const;
};

#endif // UNIFIEDFILEINFO_H